iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
AI & Data

Machine Learning系列 第 20

Day20 - Feature Engineering(特徵工程) -- 7. Date and Time Engineering (2)和時間序列

  • 分享至 

  • xImage
  •  

7. Date and Time Engineering(2)和時間序列

7.1 Date and Time Engineering
7.2 Feature Engineering for Time Series(時間序列)

單一的日期時間(Datetime)變數提供我們有價值的資訊,當它和其他日期時間(Datetime)變數一起使用時,所產生的新的特徵,給我們更有價值、更重要的資訊;常見的例子如從今天的日期和生日計算出年齡。

下面是一些從兩個日期時間(Datetime)變數間可取的一些新的特徵。

首先,建立兩個時間序列:

rng_hr = pd.date_range('2020-09-05', periods=20, freq='H')
rng_month = pd.date_range('2020-09-05', periods=20, freq='M')

df = pd.DataFrame({'date1': rng_hr, 'date2': rng_month}) 
df.head()

/|date1 |date2
------------- | -------------
0| 2020-09-05 00:00:00 |2020-09-30
1| 2020-09-05 01:00:00| 2020-10-31
2| 2020-09-05 02:00:00| 2020-11-30
3| 2020-09-05 03:00:00| 2020-12-31
4| 2020-09-05 04:00:00| 2021-01-31

提取兩個日期時間Datetime之間的差距特徵

# 兩個日期時間Datetime變數相減
df['difference'] = (df['date2'] - df['date1'])

/|date1| date2 |difference
------------- | -------------------------- | -------------
0 |2020-09-05 00:00:00| 2020-09-30| 25 days 00:00:00
1| 2020-09-05 01:00:00| 2020-10-31| 55 days 23:00:00
2| 2020-09-05 02:00:00| 2020-11-30| 85 days 22:00:00
3| 2020-09-05 03:00:00| 2020-12-31| 116 days 21:00:00
4| 2020-09-05 04:00:00| 2021-01-31| 147 days 20:00:00

提取兩個日期之間的差距特徵

# 相差幾個月
df['months_passed'] = ((df['date2'] - df['date1']) / np.timedelta64(1, 'M'))
df['months_passed'] = np.round(df['months_passed'],2)  #四捨五入至小數第二位
# 相差幾天
df['difference_days'] = (df['date2'] - df['date1']).dt.days

/|date1 | date2 | months_passed |difference_days
------------- | -------------
0 | 2020-09-05 00:00:00 | 2020-09-30 | 0.82 |25
1 | 2020-09-05 01:00:00 |2020-10-31 |1.84 |55
2 | 2020-09-05 02:00:00 | 2020-11-30 | 2.82 |85
3 | 2020-09-05 03:00:00 | 2020-12-31 | 3.84 |116
4 | 2020-09-05 04:00:00 | 2021-01-31 | 4.86 |147

提取兩個時間time之間的差距特徵

# 相差幾秒
df['diff_seconds'] = (df['date2'] - df['date1'])/np.timedelta64(1,'s')
# 相差幾分
df['diff_minutes'] = (df['date2'] - df['date1'])/np.timedelta64(1,'m')
# 相差幾小時
df['diff_hours'] = (df['date2'] - df['date1'])/np.timedelta64(1,'h')
df.head()

/|date1 | date2| diff_seconds| diff_minutes| diff_hours
------------- | -------------
0 |2020-09-05 00:00:00| 2020-09-30| 2160000.0| 36000.0 |600.0
1 |2020-09-05 01:00:00| 2020-10-31| 4834800.0| 80580.0 |1343.0
2 |2020-09-05 02:00:00| 2020-11-30| 7423200.0| 123720.0| 2062.0
3 |2020-09-05 03:00:00| 2020-12-31| 10098000.0| 168300.0| 2805.0
4| 2020-09-05 04:00:00 |2021-01-31 |12772800.0| 212880.0| 3548.0

提取和今天的差距特徵

import datetime
df['to_today'] = (datetime.datetime.today() - df['date1'])

/|date1| date2| to_today
------------- | -------------
0| 2020-09-05 00:00:00| 2020-09-30| 15 days 11:17:40.505793
1 |2020-09-05 01:00:00| 2020-10-31| 15 days 10:17:40.505793
2| 2020-09-05 02:00:00| 2020-11-30| 15 days 09:17:40.505793
3| 2020-09-05 03:00:00| 2020-12-31| 15 days 08:17:40.505793
4| 2020-09-05 04:00:00| 2021-01-31| 15 days 07:17:40.505793

7.2 Feature Engineer for Time Series(時間序列)

Time Series是一組按照時間先後順序進行排列的資料序列,資料時間間隔是相同的,且後一筆資料和前一筆有相依性。Time Series還有趨勢性和季節性等特色。

在某些情形下,做時間序列預測時,我們的資料集可能只有時間變數和標的變數(target variable),以預測氣溫為例 我們有過去的氣溫資料,要以此資料預測下周的氣溫。

墨爾本每日最低溫資料為例:

data = pd.read_csv('../input/others/daily-min-temperatures.csv', header=0, parse_dates=True, squeeze=True)
data.dtypes
Date object
Temp float64
dtype: object
# 轉換成日期格式
data['Date'] = pd.to_datetime(data['Date'],format='%Y-%m-%d')

提取前一天的氣溫lag_1特徵:
過去(時間t-1)的資料值會影響現在(時間t)的資料值,我們稱過去資料值為lag,所以t-1是lag 1,t-2是lag 2。

data['lag_1'] = data['Temp'].shift(1)
data = data[['Date', 'lag_1', 'Temp']]
data.head()

/|Date |lag_1 |Temp
------------- | -------------
0| 1981-01-01| NaN| 20.7
1| 1981-01-02| 20.7| 17.9
2| 1981-01-03| 17.9| 18.8
3| 1981-01-04| 18.8| 14.6
4| 1981-01-05| 14.6| 15.8

提取前七天的氣溫lag_1到lag_7特徵:
假如我們認為過去7天的資料值會影響現在的資料值,那我們就需要為這7天建立lags。

data['lag_1'] = data['Temp'].shift(1)
data['lag_2'] = data['Temp'].shift(2)
data['lag_3'] = data['Temp'].shift(3)
data['lag_4'] = data['Temp'].shift(4)
data['lag_5'] = data['Temp'].shift(5)
data['lag_6'] = data['Temp'].shift(6)
data['lag_7'] = data['Temp'].shift(7)
data = data[['Date', 'lag_1', 'lag_2', 'lag_3', 'lag_4', 'lag_5', 'lag_6', 'lag_7', 'Temp']]
data.head(10)

/|Date| lag_1| lag_2| lag_3| lag_4| lag_5| lag_6| lag_7| Temp
------------- | -------------
0 |1981-01-01| NaN |NaN| NaN| NaN| NaN |NaN| NaN| 20.7
1 |1981-01-02| 20.7| NaN| NaN |NaN| NaN| NaN |NaN| 17.9
2| 1981-01-03| 17.9| 20.7| NaN| NaN| NaN| NaN |NaN| 18.8
3| 1981-01-04| 18.8| 17.9| 20.7| NaN| NaN| NaN| NaN| 14.6
4| 1981-01-05| 14.6| 18.8| 17.9| 20.7| NaN |NaN| NaN| 15.8
5| 1981-01-06| 15.8| 14.6| 18.8| 17.9| 20.7| NaN| NaN| 15.8
6| 1981-01-07| 15.8| 15.8| 14.6| 18.8| 17.9| 20.7| NaN| 15.8
7| 1981-01-08| 15.8| 15.8| 15.8| 14.6| 18.8| 17.9| 20.7| 17.4
8| 1981-01-09| 17.4| 15.8| 15.8| 15.8| 14.6| 18.8| 17.9| 21.8
9| 1981-01-10| 21.8| 17.4| 15.8| 15.8| 15.8| 14.6| 18.8| 20.0

檢視目標值(當日溫度)和lags的相關性(correlation):

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(data['Temp'], lags=10)
plot_pacf(data['Temp'], lags=10)

https://ithelp.ithome.com.tw/upload/images/20200920/20129584yrCCwUS3wh.png
https://ithelp.ithome.com.tw/upload/images/20200920/20129584HsLnyHy3Dm.png
Partial Autocorrelation圖,告訴我們當日氣溫和lag 1有高度相關性lag 10較不具相關性。
Autocorrelation圖,告訴我們過去數值對未來仍有相當大的相關性。


上一篇
Day19 - Feature Engineering -- 7. Date and Time Engineering (1)
下一篇
Day21 - Feature Engineering -- 7. Date and Time Engineering(3)時間序列
系列文
Machine Learning32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言